package br.uvv.sao.managedBean;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;

import org.primefaces.event.UnselectEvent;
import org.primefaces.model.LazyDataModel;

import br.uvv.sao.domain.Perfil;
import br.uvv.sao.domain.Usuario;
import br.uvv.sao.rn.PerfilRN;
import br.uvv.sao.util.MsgUtil;
import br.uvv.sao.util.RNException;
import br.uvv.sao.util.Util;

public class PerfilBean implements Serializable {
	private static final long serialVersionUID = 4774044340419920163L;

	private PerfilRN perfilRN;
	private Usuario usuarioLogado;
	private LazyDataModel<Perfil> perfilList;
	private Perfil perfilInstance;
	private Perfil perfilInstanceTemp;
	
	public String perfil(){
		inicializarVariaveis();
		listarPerfis();
		return "goPerfis";
	}
	
	public String goHome(){
		destroy();
		return "goHome";
	}
	
	public void createPerfil(){
		try {
			perfilRN.salvarPerfil(perfilInstanceTemp);
			MsgUtil.msgInfo("Perfil '" + perfilInstanceTemp.getNome() + "' criado com sucesso");
		} catch (Exception e) {
			MsgUtil.msgError("Erro ao criar '" + perfilInstanceTemp.getNome() + "'");
			e.printStackTrace();
		}
		this.perfilInstance = new Perfil();
		listarPerfis();
	}
	
	public void preCreatePerfil(){
		this.perfilInstanceTemp = new Perfil();
	}
	
	public void editPerfil(){
		try {
			perfilRN.salvarPerfil(perfilInstanceTemp);
			MsgUtil.msgInfo("Perfil '" + perfilInstanceTemp.getNome() + "' atualizado com sucesso");
		} catch (Exception e) {
			MsgUtil.msgError("Erro ao atualizar '" + perfilInstanceTemp.getNome() + "'");
			e.printStackTrace();
		}
		this.perfilInstance = new Perfil();
		listarPerfis();
	}
	
	public void preEditPerfil(){
		this.perfilInstance = this.perfilInstanceTemp;
		this.perfilInstanceTemp = new Perfil();
	}
	
	public void deletePerfil(){
		try {
			perfilRN.removerPerfil(perfilInstance);
			MsgUtil.msgInfo("Perfil '" + perfilInstance.getNome() + "' removido com sucesso");
			listarPerfis();
			this.perfilInstance = new Perfil();
		} catch (Exception e) {
			MsgUtil.msgError("Erro ao remover '" + perfilInstance.getNome() + "'");
			e.printStackTrace();
		}
	}
	
	public void preDeletePerfil(){
		this.perfilInstance = this.perfilInstanceTemp;
		this.perfilInstanceTemp = new Perfil();
	}

	public void desativarPerfil(){
		try {
			perfilRN.desativarPerfil(perfilInstance);
			MsgUtil.msgInfo("Perfil '" + perfilInstance.getNome() + "' desativado com sucesso");
		} catch (Exception e) {
			MsgUtil.msgError("Erro ao desativar '" + perfilInstance.getNome() + "'");
		}
		this.perfilInstance = new Perfil();
		listarPerfis();
	}
	
	public void preDesativarPerfil(){
		this.perfilInstance = this.perfilInstanceTemp;
		this.perfilInstanceTemp = new Perfil();
	}

	public void ativarPerfil(){
		try {
			perfilRN.ativarPerfil(perfilInstance);
			MsgUtil.msgInfo("Perfil '" + perfilInstance.getNome() + "' ativado com sucesso");
		} catch (Exception e) {
			MsgUtil.msgError("Erro ao ativar '" + perfilInstance.getNome() + "'");
		}
		listarPerfis();
	}

	public void preAtivarPerfil(){
		this.perfilInstance = this.perfilInstanceTemp;
		this.perfilInstanceTemp = new Perfil();
	}
	
	@SuppressWarnings("serial")
	public void listarPerfis(){
		try {
			perfilList = new LazyDataModel<Perfil>() {
				@Override
				public List<Perfil> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
					return perfilRN.listarPerfis(first, pageSize, sortField, sortOrder);
				}
			};
			perfilList.setRowCount(perfilRN.perfilCount());
			perfilList.setPageSize(5);
		} catch (NullPointerException e) {
			e.printStackTrace();
		}
	}
	
	public void validateNomePerfil(FacesContext context, UIComponent toValidate, Object value) {  
		try {
			String nome = (String) value;
			Boolean temRegistros;
			temRegistros = perfilRN.validarNomeUnico(nome, perfilInstance.getId());
			if (temRegistros){
		        ((UIInput)toValidate).setValid(false);
		        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Já existe um perfil com este nome!", "");  
		        context.addMessage(toValidate.getClientId(context), message);  
		    }  
		} catch (RNException e) {
			e.printStackTrace();
		}
	    
	}
	
	public void onRowUnselect(UnselectEvent evente){
		this.perfilInstanceTemp = new Perfil();
	}
	
	@SuppressWarnings("serial")
	public void inicializarVariaveis(){
		this.perfilRN = new PerfilRN();
		this.usuarioLogado = new Usuario();
		this.usuarioLogado = Util.getUsuarioLogado();
		this.perfilList = new LazyDataModel<Perfil>() {
			@Override
			public List<Perfil> load(int first, int pagaSize, String sortField, boolean sortOrder,
					Map<String, String> arg4) {
				// TODO Auto-generated method stub
				return null;
			}
		};
		this.perfilList.setPageSize(5);
		this.perfilInstance = new Perfil();
		this.perfilInstanceTemp = new Perfil();
		listarPerfis();
	}
	
	public void destroy(){
		this.perfilRN = null;
		this.usuarioLogado = null;
		this.usuarioLogado = null;
		this.perfilList = null;
		this.perfilInstance = null;
		this.perfilInstanceTemp = null;
	}
	
	@PostConstruct
	public void init(){
		inicializarVariaveis();
	}
	
	public PerfilRN getPerfilRN() {
		return perfilRN;
	}
	public void setPerfilRN(PerfilRN perfilRN) {
		this.perfilRN = perfilRN;
	}
	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}
	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}
	public LazyDataModel<Perfil> getPerfilList() {
		return perfilList;
	}
	public void setPerfilList(LazyDataModel<Perfil> perfilList) {
		this.perfilList = perfilList;
	}
	public Perfil getPerfilInstance() {
		return perfilInstance;
	}
	public void setPerfilInstance(Perfil perfilInstance) {
		this.perfilInstance = perfilInstance;
	}
	public Perfil getPerfilInstanceTemp() {
		return perfilInstanceTemp;
	}
	public void setPerfilInstanceTemp(Perfil perfilInstanceTemp) {
		this.perfilInstanceTemp = perfilInstanceTemp;
	}
}
